import { invoke } from "@tauri-apps/api";

/**
 * Fop Api
 */
export class FopApi {
    /**
     * 用于根据指定的模式匹配文件路径并返回匹配成功的文件路径数组
     * @param patterns 要匹配的文件路径模式，可以是一个字符串或字符串数组
     * @param caseSensitive 是否进行大小写敏感匹配，默认为false
     * @param requireLiteralSeparator 是否要求路径分隔符为字面量，即正斜线或反斜线。默认为false
     * @param requireLiteralLeadingDot 是否要求路径模式以点开头。默认为false
     * @returns 返回一个 Promise，解析为匹配成功的文件路径数组
     */
    public static glob(
        patterns: string | string[],
        caseSensitive?: boolean,
        requireLiteralSeparator?: boolean,
        requireLiteralLeadingDot?: boolean,
    ): Promise<string[]> {
        if (typeof patterns === "string") {
            patterns = [patterns];
        }

        return invoke("glob", { patterns, caseSensitive, requireLiteralSeparator, requireLiteralLeadingDot });
    }

    /**
     * 在数据中查找匹配给定模式的文件路径
     * @param patterns 匹配模式，可以是字符串或字符串数组
     * @param caseSensitive 是否进行大小写敏感匹配
     * @param requireLiteralSeparator 是否需要使用转义字符作为分隔符
     * @param requireLiteralLeadingDot 是否需要使用转义字符作为开头的点
     * @returns 匹配成功的文件路径数组的 Promise
     */
    public static globInData(
        patterns: string | string[],
        caseSensitive?: boolean,
        requireLiteralSeparator?: boolean,
        requireLiteralLeadingDot?: boolean,
    ): Promise<string[]> {
        if (typeof patterns === "string") {
            patterns = [patterns];
        }

        return invoke("glob_in_data", { patterns, caseSensitive, requireLiteralSeparator, requireLiteralLeadingDot });
    }

    /**
     * 读取 JSON 文件数据
     * @param fileName 文件名
     * @returns JSON文件的解析内容
     */
    public static readJson<T>(fileName: string): Promise<T> {
        return invoke("read_json", { fileName });
    }

    /**
     * 写入 JSON 数据到指定文件
     * @param fileName 文件名
     * @param value 要写入的 JSON 数据
     */
    public static writeJson(fileName: string, value: any) {
        return invoke("write_json", { fileName, value });
    }

    /**
     * 删除 JSON 文件
     * @param fileName 要删除的文件名
     */
    public static removeJson(fileName: string) {
        return invoke("remove_json", { fileName });
    }

    /**
     * 重命名 JSON 文件
     * @param oldName 原始文件名
     * @param newName 新文件名
     */
    public static renameJson(oldName: string, newName: string) {
        return invoke("rename_json", { oldName, newName });
    }

    /**
     * 打开数据文件夹
     */
    public static openDataFolder() {
        return invoke("open_data_folder");
    }
}
